from django.shortcuts import render,redirect
#导包
from django.http import HttpResponse,HttpResponseRedirect,JsonResponse
#导入类视图
from django.views import View

from myapp.models import User
import json
from django.core.serializers import serialize
from rest_framework.response import Response
from rest_framework.views import APIView
#导入加密库
import hashlib
#导入图片库
#绘画库
from PIL import ImageDraw
#字体库
from PIL import ImageFont
#图片库
from PIL import Image
#随机库
import random
#文件流
import io

import requests

#导入上传文件夹配置
from mydjango.settings import UPLOAD_ROOT
import os

#导入原生sql模块
from django.db import connection

import jwt

#导入redis数据库
import redis

#导入时间模块
import time
import datetime

#导入公共目录变量
from mydjango.settings import BASE_DIR

#导包
from django.db.models import Q,F

#导入dwebsocket的库
from dwebsocket.decorators import accept_websocket
import uuid

import redis

#定义ip和端口
host = "localhost"
port = 6379

#建立链接
r = redis.Redis(host=host,port=port)

  # 用户密码更新接口
class UpdatePassword(APIView):
    def get(self,request):

        # 接收参数
        uid = request.GET.get('uid')
        password = request.GET.get('password')

        # 查询修改用户
        user = User.objects.get(id=int(uid))

        # 保存新密码
        user.password = make_password(password)
        user.save()

        return Response({'message':'修改成功'})


#自定义图片验证码
class MyCode(View):

	#定义rgb随机颜色
	def get_random_color(self):

		R = random.randrange(255)
		G = random.randrange(255)
		B = random.randrange(255)

		return (R,G,B)

	#定义图片视图
	def get(self,request):
		#画布
		img_size = (120,50)
		#定义图片对象
		image = Image.new('RGB',img_size,'white')
		#定义画笔
		draw = ImageDraw.Draw(image,'RGB')
		source = '0123456789abcdefghijk'
		#接收容器
		code_str = ''
		#进入循环绘制
		for i in range(4):
			#获取字母颜色
			text_color = self.get_random_color()
			#获取随机下标
			tmp_num = random.randrange(len(source))
			#随机字符串
			random_str = source[tmp_num]
			#装入容器
			code_str += random_str
			#绘制字符串
			draw.text((10+30*i,20),random_str,text_color)
		#获取缓存区
		buf = io.BytesIO()
		#将临时图片保存到缓冲
		image.save(buf,'png')
		#保存随机码
		r.set('code',code_str)
		print(r.get('code'))

		return HttpResponse(buf.getvalue(),'image/png')

#md5加密方法
def make_password(mypass):
    #生成md5对象
    md5 = hashlib.md5()
    #转码
    mypass_utf8 = str(mypass).encode(encoding="utf-8")
    #加密操作
    md5.update(mypass_utf8)

    return md5.hexdigest()


#登录接口
class Login(APIView):

    def get(self,request):

        #接收参数
        username = request.GET.get('username','未收到用户名')
        password = request.GET.get('password','未收到密码')
        code = request.GET.get('code', None)

        # 比对验证码
        redis_code = r.get("code")
        # 转码 str(redis_code,'utf-8')
        redis_code = redis_code.decode("utf-8")

        if code != redis_code:
            return Response({'code': 403, 'message': '您输入的验证码有误'})

        #查询数据
        user = User.objects.filter(username=username,password=make_password(password)).first()

        if user:
            res = {}
            res['code'] = 200
            res['message'] = '登录成功'
            res['username'] = user.username
            res['uid'] = user.id
            return Response(res)
        else:
            res = {}
            res['code'] = 405
            res['message'] = '用户名或者密码错误'
            return Response(res)

#注册接口
class Register(APIView):

    def get(self,request):

        #接收参数
        username = request.GET.get('username',None)
        password = request.GET.get('password',None)

        #排重操作
        user = User.objects.filter(username=username).first()

        if user:
            res = {}
            res['code'] = 403
            res['message'] = '用户已经存在'
            return Response(res)

        #进行入库操作
        user = User(username=username,password=make_password(password))
        #保存
        user.save()

        #返回结果
        res = {}
        res['code'] = 200
        res['message'] = '注册成功'
        return Response(res)


